package jp.ac.u_tokyo.dch.dao.common;

import jp.ac.u_tokyo.dch.core.db.CustomPreparedStatement;
import jp.ac.u_tokyo.dch.core.db.CustomResultSet;
import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.core.exceptions.DBException;

/**
* @version 1.1
*/
public class SeqenceGenerator {


	/**
	 * DBコネクションオブジェクト
	 */
	private DBConnection dbconn = null;

	/**
	 * データスキーマシーケンステーブル
	 */
	public static final String DATA_SCHEMA_SEQ = "data_schema_seq";

	/**
	 * データシーケンステーブル
	 */
	public static final String DATA_SEQ = "data_seq";

	/**
	 * フリント表示シーケンステーブル
	 */
	public static final String FRONT_DISPLAY_SEQ = "front_seq";

	/**
	 * 項目シーケンステーブル
	 */
	public static final String FIELD_SEQ = "field_seq";

	/**
	 * タグシーケンステーブル
	 */
	public static final String TAG_SEQ = "tag_seq";

	/**
	 * データ表示シーケンステーブル
	 */
	public static final String DATA_DISPLAYS_SEQ = "data_displays_seq";

	/**
	 * シーケンス更新SQL
	 */
	private static final String query = "UPDATE %s SET id=LAST_INSERT_ID(id+1)";

	/**
	 * カスタム項目ヘッダ
	 */
	private static final String CUSTOM_FIELD_HEAD = "CUSTOM_";

	/**
	 * 生成者
	 * @param DBコネクションオブジェクト
	 */
	public SeqenceGenerator(DBConnection dbconn){
		this.dbconn = dbconn;
	}

	/**
	 * 項目キーを生成する
	 * @return 項目キー
	 * @throws DBException
	 */
	public String generateFieldKey() throws DBException {

		StringBuilder key = new StringBuilder();

		key.append(CUSTOM_FIELD_HEAD);

		CustomPreparedStatement ps1 = null;
		CustomPreparedStatement ps2 = null;
		CustomResultSet rs = null;
		int result = 0;
		try{
			String getseq = "SELECT LAST_INSERT_ID() AS SEQ";

			ps1 = dbconn.prepareStatement(String.format(query, FIELD_SEQ));
			ps2 = dbconn.prepareStatement(getseq);

			ps1.executeUpdate();

			rs = ps2.executeQuery();

			if (rs.next()){

				result = rs.getInt("SEQ");
			}
			key.append(String.format("%05d", result));

			//資料テーブルに現物資料データとのトランザクション処理のためDBコネクションクローズはしない。
		}catch(DBException dbe){
			throw dbe;
		}finally{
			if(ps1 != null) ps1.close();
			if(ps2 != null) ps2.close();
		}
		return key.toString();

	}


	/**
	 * シーケンス番号を返す
	 * @param seqname シーケンス名
	 * @return シーケンス番号
	 * @throws DBException
	 */
	public int getSequence(String seqname) throws DBException {

		CustomPreparedStatement ps1 = null;
		CustomPreparedStatement ps2 = null;
		CustomResultSet rs = null;
		int result = 0;
		try{
			String getseq = "SELECT LAST_INSERT_ID() AS SEQ";

			ps1 = dbconn.prepareStatement(String.format(query, seqname));
			ps2 = dbconn.prepareStatement(getseq);

			ps1.executeUpdate();

			rs = ps2.executeQuery();

			if (rs.next()){

				result = rs.getInt("SEQ");
			}

			//資料テーブルに現物資料データとのトランザクション処理のためDBコネクションクローズはしない。
		}catch(DBException dbe){
			throw dbe;
		}finally{
			if(ps1 != null) ps1.close();
			if(ps2 != null) ps2.close();
		}
		return result;

	}

}
